

// namespace Umikaze::Core
// {
//     template <typename enumtype, typename storagetype = uint32_t>
//     class Flags
//     {
//     public:
//         typedef storagetype InternalType;
//         Flags(void);
//         Flags(enumtype e);
//         Flags(const Flags<enumtype, storagetype>& f);
//         explicit Flags(storagetype b);

//         bool isSet(enumtype e) const;
//         Flags<enumtype, storagetype>& set(enumtype e);
//         bool operator==(enumtype e) const;
//         bool operator==(const Flags<enumtype, storagetype>& f) const;
//         bool operator==(bool b) const;
//         bool operator!=(enumtype e) const;
//         bool operator!=(const Flags<enumtype, storagetype>& f) const;

//         Flags<enumtype, storagetype>& operator=(const Flags<enumtype,
//         storagetype>& f); Flags<enumtype, storagetype>& operator=(enumtype
//         e);

//         Flags<enumtype, storagetype>& operator|=(enumtype e);
//         Flags<enumtype, storagetype>& operator|=(const Flags<enumtype,
//         storagetype>& f); Flags<enumtype, storagetype> operator|(enumtype e)
//         const; Flags<enumtype, storagetype> operator|(const Flags<enumtype,
//         storagetype>& f) const;

//         Flags<enumtype, storagetype>& operator&=(enumtype e);
//         Flags<enumtype, storagetype>& operator&=(const Flags<enumtype,
//         storagetype>& f); Flags<enumtype, storagetype> operator&(enumtype e)
//         const; Flags<enumtype, storagetype> operator&(const Flags<enumtype,
//         storagetype>& f) const;

//         Flags<enumtype, storagetype>& operator^=(enumtype e);
//         Flags<enumtype, storagetype>& operator^=(const Flags<enumtype,
//         storagetype>& f); Flags<enumtype, storagetype> operator^(enumtype e)
//         const; Flags<enumtype, storagetype> operator^(const Flags<enumtype,
//         storagetype>& f) const;

//         Flags<enumtype, storagetype> operator~(void) const;

//         operator bool(void) const;
//         operator uint8_t(void) const;
//         operator uint16_t(void) const;
//         operator uint32_t(void) const;

//         void clear(enumtype e);

//     public:
//         friend  Flags<enumtype, storagetype> operator&(enumtype a,
//         Flags<enumtype, storagetype>& b)
//         {
//             Flags<enumtype, storagetype> out;
//             out.mBits = a & b.mBits;
//             return out;
//         }

//     private:
//         storagetype mBits;
//     };
// } // namespace Umikaze::Core
